#ifndef THREAD_CACHE_H
#define THREAD_CACHE_H

#include <array>

#include "Common.h"

namespace MemoryPool
{
    class ThreadCache
    {
    public:
        static ThreadCache &getInstance();

        void *alloc(size_t needSize);
        void dealloc(void *needStart, const size_t needSize);

    private:
        ThreadCache();
        ThreadCache(const ThreadCache &) = delete;
        ThreadCache &operator=(const ThreadCache &) = delete;
        ThreadCache(const ThreadCache &&) = delete;
        ThreadCache &operator=(const ThreadCache &&) = delete;

        // 从中心缓存获取内存
        void *allocFromCentralCache(const size_t needIndex);
        // 归还阈值
        static const size_t deallocThreshold_ = 64; // 某个链表的range/节点是否超过64
        // 归还内存到中心缓存
        // void deallocToCentralCache(void *needStart, const size_t needSize);
        // OPTIMIZE: 直接传参，不需要再重复计算
        void deallocToCentralCache(void *needStart, const size_t needSize, const size_t needIndex, const size_t needNodeNum);

        // 上面是按需申请一个range/node，下面是批量申请多个同样大小的range/node
        void *allocFromCentralCache2(const size_t needIndex);
        // 从中央缓存申请时，计算批量获取内存节点的数量
        size_t needSizeToNodeNum(const size_t needSize);

        // 和下层的range freeList类似
        std::array<void *, SizeManager::FREE_LIST_NUM> freeNodes_;    // 每个线程的空闲链表数组
        std::array<size_t, SizeManager::FREE_LIST_NUM> freeNodeNums_; // 每个空闲链表的range/node数量统计
    };
} // namespace MemoryPool

#endif // THREAD_CACHE_H